/*
 * $Id: PDFFont.java,v 1.3 2007/08/26 19:00:11 gil1 Exp $ $Date: 2007/08/26
 * 19:00:11 $ This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of the License,
 * or (at your option) any later version. This library is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU Lesser General Public License for more details. You should have
 * received a copy of the GNU Lesser General Public License along with this
 * library; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
package gnu.jpdf;

import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;

/**
 * This class defines a font within a PDF document.
 * 
 * @author Peter T Mount,http://www.retep.org.uk/pdf/
 * @author Eric Z. Beard, ericzbeard@hotmail.com
 * @author Gilbert DeLeeuw, gil1@users.sourceforge.net
 * @version $Revision: 1.3 $, $Date: 2007/08/26 19:00:11 $
 */
public class PDFFont extends PDFObject implements Serializable
{
    
    /*
     * NOTE: The original class is the work of Peter T. Mount, who released it
     * in the uk.org.retep.pdf package. It was modified by Eric Z. Beard as
     * follows: The package name was changed to gnu.pdf. The formatting was
     * changed a little bit It is still licensed under the LGPL.
     */

    /**
     * The PDF document name of the font
     */
    private String name;
    
    /**
     * The PDF type of the font, usually /Type1
     */
    private String type;
    
    /**
     * The font's real name
     */
    private String font;
    
    /**
     * The name of the equivalent Java font
     */
    private String javaFont;
    
    /**
     * The PDF Style, ie: BOLD, ITALIC, etc
     */
    private int style;
    
    /**
     * This constructs a default PDFFont. In this case Helvetica
     */
    protected PDFFont()
    {
        this("/F1", "/Type1", "Helvetica", Font.PLAIN);
    }
    
    /**
     * Constructs a PDFFont. This will attempt to map the font from a known Java
     * font name to that in PDF, defaulting to Helvetica if not possible.
     * 
     * @param name
     *            The document name, ie /F1
     * @param type
     *            The pdf type, ie /Type1
     * @param font
     *            The font name, ie Helvetica
     * @param style
     *            The java.awt.Font style, ie: Font.PLAIN
     */
    public PDFFont(String name, String type, String font, int style)
    {
        super("/Font");
        this.name = name;
        this.type = type;
        this.style = style;
        
        String f = font.toLowerCase();
        
        // default PDF Font name
        // this.font = base14[0][1];
        // this.javaFont = base14[0][0];
        this.font = font;
        this.javaFont = "/" + font;
        
        // attempt to translate the font name from Java to PDF
        for (int i = 0; i < base14.length; i++)
        {
            if (base14[i][0].equals(f))
            {
                this.javaFont = base14[i][0];
                this.font = base14[i][1 + style];
                // System.out.println("Setting a font style to: " + this.font);
                break;
            }
        }
    }
    
    /**
     * This is the most common method to use.
     * 
     * @return the Font name within the PDF document.
     */
    public String getName()
    {
        return name;
    }
    
    /**
     * @return the Font's PDF type
     */
    public String getType()
    {
        return type;
    }
    
    /**
     * @return The PDF Font name
     */
    public String getFont()
    {
        return font;
    }
    
    /**
     * @return the font style.
     * @see java.awt.Font
     */
    public int getStyle()
    {
        return style;
    }
    
    /**
     * @param os
     *            OutputStream to send the object to
     * @exception IOException
     *                on error
     */
    public void write(OutputStream os) throws IOException
    {
        // Write the object header
        writeStart(os);
        
        // now the objects body
        os.write("/Subtype ".getBytes());
        os.write(type.getBytes());
        os.write("\n/Name ".getBytes());
        os.write(name.getBytes());
        os.write("\n/BaseFont ".getBytes());
        os.write(font.getBytes());
        // The performance problem in Bug#106693 comments out the
        // encoding line, and removes the /WinAnsiEncoding. I'm going
        // to leave them in, as the Encoding fixes another problem.
        os.write("\n/Encoding ".getBytes());
        os.write("/WinAnsiEncoding".getBytes());
        // os.write(encoding.getBytes());
        os.write("\n".getBytes());
        
        // finish off with its footer
        writeEnd(os);
    }
    
    /**
     * This is used by the PDF and PDFPage classes to compare font names
     * 
     * @param type
     *            The pdf type, ie /Type1
     * @param font
     *            The font name, ie Helvetica
     * @param style
     *            The java.awt.Font style, ie: Font.PLAIN
     * @return true if this object is identical to this font's spec
     */
    protected boolean equals(String type, String font, int style)
    {
        return this.type.equals(type)
                && (this.font.equalsIgnoreCase(font)
                || this.javaFont.equalsIgnoreCase(font));
        // new styles not being picked up - ezb june 6 2001
        // || this.javaFont.equalsIgnoreCase(font));
        
        // Removed in fix for Bug#106693
        // why? - ezb - can't find bug in bug tracker
        // && this.style==style;
    }
    
    /**
     * This maps the standard JDK1.1 font names and styles to the base 14 PDF
     * fonts
     */
    private static String[][] base14 = {
            // java name
            // NORMAL
            // BOLD
            // ITALIC
            // BOLD+ITALIC
            {
                    "arial",
                    "/Helvetica",
                    "/Helvetica-Bold",
                    "/Helvetica-Oblique",
                    "/Helvetica-BoldOblique" },
            {
                    "sansserif",
                    "/Helvetica",
                    "/Helvetica-Bold",
                    "/Helvetica-Oblique",
                    "/Helvetica-BoldOblique" },
            {
                    "monospaced",
                    "/Courier",
                    "/Courier-Bold",
                    "/Courier-Oblique",
                    "/Courier-BoldOblique" },
            {
                    "timesroman",
                    "/Times-Roman",
                    "/Times-Bold",
                    "/Times-Italic",
                    "/Times-BoldItalic" },
            {
                    "courier",
                    "/Courier",
                    "/Courier-Bold",
                    "/Courier-Oblique",
                    "/Courier-BoldOblique" },
            {
                    "helvetica",
                    "/Helvetica",
                    "/Helvetica-Bold",
                    "/Helvetica-Oblique",
                    "/Helvetica-BoldOblique" },
            {
                    "dialog",
                    "/Courier",
                    "/Courier-Bold",
                    "/Courier-Oblique",
                    "/Courier-BoldOblique" },
            {
                    "dialoginput",
                    "/Courier",
                    "/Courier-Bold",
                    "/Courier-Oblique",
                    "/Courier-BoldOblique" }, };
    
}
